/**
 */
package fUML.Semantics.Classes.Kernel;

import fUML.Semantics.CommonBehaviors.BasicBehaviors.Execution;
import fUML.Semantics.CommonBehaviors.BasicBehaviors.ParameterValue;

import fUML.Semantics.CommonBehaviors.Communications.EventAccepter;
import fUML.Semantics.CommonBehaviors.Communications.ObjectActivation;
import fUML.Semantics.CommonBehaviors.Communications.SignalInstance;

import fUML.Syntax.Classes.Kernel.Classifier;
import fUML.Syntax.Classes.Kernel.Operation;

import org.eclipse.emf.common.util.EList;

/**
 * <!-- begin-user-doc -->
 * A representation of the model object '<em><b>Object</b></em>'.
 * <!-- end-user-doc -->
 *
 * <!-- begin-model-doc -->
 * An object is an extensional value that may have multiple types, all of which
 *                 must be classes. (Note that a destroyed object has no types.)
 *  An object has
 *                 a unique identity. Usually, references to objects are manipulated, rather than the
 *                 objects themselves, and there may be multiple references to the same
 *                 object.
 *  If an object is active, it has an object activation that handle the
 *                 execution of its classifier behavior(s).
 * <!-- end-model-doc -->
 *
 * <p>
 * The following features are supported:
 * <ul>
 *   <li>{@link fUML.Semantics.Classes.Kernel.Object#getObjectActivation <em>Object Activation</em>}</li>
 *   <li>{@link fUML.Semantics.Classes.Kernel.Object#getTypes <em>Types</em>}</li>
 * </ul>
 * </p>
 *
 * @see fUML.Semantics.Classes.Kernel.KernelPackage#getObject()
 * @model
 * @generated
 */
public interface Object extends ExtensionalValue, PackageableElement {
	/**
	 * Returns the value of the '<em><b>Object Activation</b></em>' containment reference.
	 * It is bidirectional and its opposite is '{@link fUML.Semantics.CommonBehaviors.Communications.ObjectActivation#getObject <em>Object</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * <!-- begin-model-doc -->
	 * The object activation handling the active behavior of this object.
	 * <!-- end-model-doc -->
	 * @return the value of the '<em>Object Activation</em>' containment reference.
	 * @see #setObjectActivation(ObjectActivation)
	 * @see fUML.Semantics.Classes.Kernel.KernelPackage#getObject_ObjectActivation()
	 * @see fUML.Semantics.CommonBehaviors.Communications.ObjectActivation#getObject
	 * @model opposite="object" containment="true" ordered="false"
	 * @generated
	 */
	ObjectActivation getObjectActivation();

	/**
	 * Sets the value of the '{@link fUML.Semantics.Classes.Kernel.Object#getObjectActivation <em>Object Activation</em>}' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Object Activation</em>' containment reference.
	 * @see #getObjectActivation()
	 * @generated
	 */
	void setObjectActivation(ObjectActivation value);

	/**
	 * Returns the value of the '<em><b>Types</b></em>' reference list.
	 * The list contents are of type {@link fUML.Syntax.Classes.Kernel.Class}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * <!-- begin-model-doc -->
	 * The classes under which this object is currently classified. (A destroyed
	 *                   object has no types.)
	 * <!-- end-model-doc -->
	 * @return the value of the '<em>Types</em>' reference list.
	 * @see fUML.Semantics.Classes.Kernel.KernelPackage#getObject_Types()
	 * @model ordered="false"
	 * @generated
	 */
	EList<Classifier> getTypes();

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * <!-- begin-model-doc -->
	 * // Create an object activation for this object (if one does not already exist)
	 *                   and start its behavior(s).
	 *  
	 *  // Debug.println("[startBehavior] On
	 *                   object...");
	 *  
	 *  if (this.objectActivation == null) {
	 *                   this.objectActivation = new ObjectActivation();
	 *                   this.objectActivation.object = this;
	 *  }
	 *  
	 *  //
	 *                   Debug.println("[startBehavior] objectActivation = " + objectActivation);
	 *                   
	 *  this.objectActivation.startBehavior(classifier, inputs);
	 *                 
	 * <!-- end-model-doc -->
	 * @model classifierOrdered="false" inputsMany="true" inputsOrdered="false"
	 * @generated
	 */
	void startBehavior(fUML.Syntax.Classes.Kernel.Class classifier, EList<ParameterValue> inputs);

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * <!-- begin-model-doc -->
	 * // Dispatch the given operation to a method execution, using a dispatch
	 *                   strategy.
	 *  
	 *  return
	 *                   ((DispatchStrategy)this.locus.factory.getStrategy("dispatch")).dispatch(this,
	 *                   operation);
	 *  
	 * <!-- end-model-doc -->
	 * @model required="true" ordered="false" operationRequired="true" operationOrdered="false"
	 * @generated
	 */
	Execution dispatch(Operation operation);

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * <!-- begin-model-doc -->
	 * // If the object is active, add the given signal instance to the event pool
	 *                   and signal that a new signal instance has arrived.
	 *  
	 *  if
	 *                   (this.objectActivation != null) {
	 *                   this.objectActivation.send(signalInstance);
	 *  }
	 *  
	 *  
	 * <!-- end-model-doc -->
	 * @model signalInstanceRequired="true" signalInstanceOrdered="false"
	 * @generated
	 */
	void send(SignalInstance signalInstance);

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * <!-- begin-model-doc -->
	 * // Register the given accept event accepter to wait for a dispatched signal
	 *                   event.
	 *  
	 *  if (this.objectActivation != null) {
	 *                   this.objectActivation.register(accepter);
	 *  }
	 *  
	 * <!-- end-model-doc -->
	 * @model accepterRequired="true" accepterOrdered="false"
	 * @generated
	 */
	void register(EventAccepter accepter);

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @model accepterRequired="true" accepterOrdered="false"
	 * @generated
	 */
	void unregister(EventAccepter accepter);

} // Object
